#include <malloc.h>
#include <time.h>
#include<stdio.h>
#include<stdlib.h>

/**** petite macro pour choisir le type des matrices et vecteurs entiers ou reels ******/
// gcc -DTYPE_INT
#ifdef INT
typedef int T;
#else
#ifdef FLOAT
typedef float T;
#else
 #error "Need to give MACRO definition for element type : -DINT or -DFLOAT"
#endif
#endif
/***************************************************************************************/


#include "fonctions.c"



/*********** programme principal********************************/ 

int main(int argc, char *argv[])
{


	//declarations parametres
	// on precisera la taille des matrices en ligne de commande
	int dim1=atoi(argv[1]);
	int dim2=atoi(argv[2]);
	int f_compteur=atoi(argv[3]);
	int i,j;
	int dim;
	
	int valeurmax,valeurmin;
	
	T* A;
	T* u;
	T* v;

	dim=dim1*dim2;
	//pour le stockage de matrice dense 2D
	//allocation dynamique en memoire de A, u et du vecteur resultat
	A=(T*)malloc(dim*sizeof(T));
	v=(T*)malloc(dim1*sizeof(T));
	u=(T*)malloc(dim2*sizeof(T));
	
	valeurmax=100000;
	valeurmin=-100000;

    //les coefficients de A sont aleatoires
	for(i=0;i<dim1;i++)
	{
		for(j=0;j<dim2;j++)
		{
			
			A[i*dim2+j]=(T)rand()*(valeurmax-valeurmin)+valeurmin;
			u[j]=(T)1;
		}
		
	}

////------------------------Affichage matrice

////affichons la matrice I et le tableau de valeurs
//for (i=0;i<dim1;i++)
//{
//for (j=0;j<2;j++)
//{
//printf("%d\t", I[i][j]);
//}
//printf("|%f\n",Value[i] );
//}

//printf("\n");

////affichons la matrice A
//for (i=0;i<dim1;i++)
//{
//for (j=0;j<dim2;j++)
//{
//printf("%f\t", A[i*(dim1-1)+j]);
//}
//printf("|%f\n",u[i] );
//}

//printf("\n" );


//appel fonctions produit
	GEMV_1D(A,u,v,dim1,dim2,f_compteur);

/**************liberation memoire***********************************************/
//liberation en memoire de A,u et v
	free(A);
	free(u);
	free(v);
/****************************************************************************/

return 0;
}
